﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using memo;

namespace memoTest
{
    /// <summary>
    /// A VideoFile osztály unit tesztje.
    /// </summary>
    [TestClass]
    public class VideoFileTest
    {
        /// <summary>
        /// Empty Constructor to speed up compilation.
        /// </summary>
        public VideoFileTest() { }

        #region Constructors tests.
        /// <summary>
        /// VideoFile objektum létrehozásának tesztelése MP4 videó inputtal.
        /// </summary>
        [TestMethod]
        public void CreateVideoFileWithMP4InputTest()
        {
            string expectedFilePath = "videotest/video.mp4";
            VideoFile.VideoFormat expectedVideoFileFormat = VideoFile.VideoFormat.MP4;
            VideoFile testVideo = new VideoFile(expectedFilePath, expectedVideoFileFormat);
            Assert.AreEqual(expectedVideoFileFormat, testVideo.Format,
                string.Format("Az ellenőrzésnél a fájl formátuma nem egyezik a várt formátum: '{0}' helyett '{1}' szerepel.",
                expectedVideoFileFormat, testVideo.Format));
            Assert.AreEqual(expectedFilePath, testVideo.FilePath,
                string.Format("Az ellenőrzésnél a fájl elérési útvonala nem egyezik a várt formátum: '{0}' helyett '{1}' szerepel.",
                expectedFilePath, testVideo.FilePath));
        }


        /// <summary>
        /// VideoFile objektum létrehozásának tesztelése AVI videó inputtal.
        /// </summary>
        [TestMethod]
        public void AVIVideoTest()
        {
            string expectedFilePath = "videotest/video.avi";
            VideoFile.VideoFormat expectedVideoFileFormat = VideoFile.VideoFormat.AVI;
            VideoFile testVideo = new VideoFile(expectedFilePath, expectedVideoFileFormat);
            Assert.AreEqual(expectedVideoFileFormat, testVideo.Format,
                string.Format("Az ellenőrzésnél a fájl formátuma nem egyezik a várt formátum: '{0}' helyett '{1}' szerepel.",
                expectedVideoFileFormat, testVideo.Format));
            Assert.AreEqual(expectedFilePath, testVideo.FilePath,
                string.Format("Az ellenőrzésnél a fájl elérési útvonala nem egyezik a várt formátum: '{0}' helyett '{1}' szerepel.",
                expectedFilePath, testVideo.FilePath));
        }

        /// <summary>
        /// VideoFile objektum létrehozásának tesztelése MKV videó inputtal.
        /// </summary>
        [TestMethod]
        public void MKVVideoTest()
        {
            string expectedFilePath = "videotest/video.mkv";
            VideoFile.VideoFormat expectedVideoFileFormat = VideoFile.VideoFormat.MKV;
            VideoFile testVideo = new VideoFile(expectedFilePath, expectedVideoFileFormat);
            Assert.AreEqual(expectedVideoFileFormat, testVideo.Format,
                string.Format("Az ellenőrzésnél a fájl formátuma nem egyezik a várt formátum: '{0}' helyett '{1}' szerepel.",
                expectedVideoFileFormat, testVideo.Format));
            Assert.AreEqual(expectedFilePath, testVideo.FilePath,
                string.Format("Az ellenőrzésnél a fájl elérési útvonala nem egyezik a várt formátum: '{0}' helyett '{1}' szerepel.",
                expectedFilePath, testVideo.FilePath));
        }

        /// <summary>
        /// VideoFile objektum létrehozásának tesztelése MPG videó inputtal.
        /// </summary>
        [TestMethod]
        public void MPGVideoTest()
        {
            string expectedFilePath = "videotest/video.mpg";
            VideoFile.VideoFormat expectedVideoFileFormat = VideoFile.VideoFormat.MPG;
            VideoFile testVideo = new VideoFile(expectedFilePath, expectedVideoFileFormat);
            Assert.AreEqual(expectedVideoFileFormat, testVideo.Format,
                string.Format("Az ellenőrzésnél a fájl formátuma nem egyezik a várt formátum: '{0}' helyett '{1}' szerepel.",
                expectedVideoFileFormat, testVideo.Format));
            Assert.AreEqual(expectedFilePath, testVideo.FilePath,
                string.Format("Az ellenőrzésnél a fájl elérési útvonala nem egyezik a várt formátum: '{0}' helyett '{1}' szerepel.",
                expectedFilePath, testVideo.FilePath));
        }

        /// <summary>
        /// A VideoFile konstruktorának tesztje, hogy üres elérési útvonalra megfelelő kivétel dobódik-e meg.
        /// </summary>
        [TestMethod]
        [ExpectedException(typeof(ArgumentNullException), "Nem az elvárt Exception dobódott meg a null paraméter hatására.")]
        public void VideoFileConstructorTestWithoutFilePath()
        {
            new VideoFile(default(string), default(VideoFile.VideoFormat));
        }
        #endregion
    }
}
